package com.john.cloud.nacos.provider.springcloudzuul.filter;

import com.john.cloud.nacos.provider.springcloudzuul.enums.FilterEnum;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author: JohnCoding
 * @Description: 自定义Zuul过滤器，路由访问
 * 过滤器级别
 * pre->routing->post->返回
 * @date: 2020/7/3 9:44
 */
@Component
public class ZuulFilter extends com.netflix.zuul.ZuulFilter {
    @Override
    public String filterType() {
        //这里是定义过滤器级别
        //可做枚举，有pre、route、post、error四种
        return FilterEnum.PRE.getValue();
    }

    @Override
    public int filterOrder() {
        //定义过滤器执行顺序，数值越小执行顺序越高，执行越快
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        //表示是否需要执行该filter，true表示执行，false表示不执行
        return true;
    }

    @Override
    public Object run(){
        //filter需要执行的具体操作  具体的业务操作
        //如鉴权、消息分发、请求统计等。
        //可以通过Zuul拿到HttpRequest 做操作
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        // 获取请求的参数
        String token = request.getParameter("token");
        if(StringUtils.isNotBlank(token)){
            //对请求进行路由
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(200);
            ctx.set("isSuccess", true);
        }else {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(400);
            ctx.setResponseBody("token is empty");
            ctx.set("isSuccess", false);
        }
        return null;
    }
}
